package com.xj.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * Excel表列名称--和进制有一点不同
 */
public class L168_数字转化为Excel列名 {

    /**
     * 给定一个正整数，返回它在 Excel 表中相对应的列名称。
     * <p>
     * 例如，
     * <p>
     * 1 -> A
     * 2 -> B
     * 3 -> C
     * ...
     * 26 -> Z
     * 27 -> AA
     * 28 -> AB
     * ...
     * 示例 1:
     * <p>
     * 输入: 1
     * 输出: "A"
     * 示例 2:
     * <p>
     * 输入: 28
     * 输出: "AB"
     * 示例 3:
     * <p>
     * 输入: 701
     * 输出: "ZY"
     */

    public static void main(String[] args) {
        System.out.println(convertToTitleOffice(1));
        System.out.println(convertToTitleOffice(28));
        System.out.println(convertToTitleOffice(701));
        System.out.println(convertToTitleOffice(52));
    }

    //自己的解法；遇到余数为0，则商-1，余数+26
    public static String convertToTitle(int n) {
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < 26; i++) {
            map.put(i + 1, (char) (i + 'A') + "");
        }

        String result = "";
        while (n > 0) {
            int remainder = n % 26;
            int consult = n / 26;
            if (remainder == 0) {
                consult--;
                remainder = remainder + 26;
            }
            result = map.get(remainder) + result;
            n = consult;
        }
        return result;
    }

    //官方解法：同样的进制变形解法
    public static String convertToTitleOffice(int n) {
        StringBuilder sb = new StringBuilder();
        while (n > 0) {
            int c = n % 26;
            if (c == 0) {
                c = 26;
                n -= 1;
            }
            sb.insert(0, (char) ('A' + c - 1));
            n /= 26;
        }
        return sb.toString();
    }

}